<?php

namespace application\modules\mobile\controllers;

use application\core\utils\Attach;
use application\core\utils\Convert;
use application\core\utils\Env;
use application\core\utils\File;
use application\core\utils\IBOS;
use application\core\utils\Page;
use application\core\utils\StringUtil;
use application\modules\message\model\Comment;
use application\modules\message\model\Feed;
use application\modules\message\model\FeedDigg;
use application\modules\mobile\utils\Mobile;
use application\modules\user\utils\User as UserUtil;
use application\modules\weibo\core\WbConst;
use application\modules\weibo\model\Follow;
use application\modules\weibo\utils\Feed as WbfeedUtil;

class WeiboController extends BaseController {

	/**
	 * 微博首页
	 */
	public function actionIndex() {
		$var['type'] = isset( $_GET['type'] ) ? StringUtil::filterCleanHtml( $_GET['type'] ) : 'all';
		$var['feedtype'] = isset( $_GET['feedtype'] ) ? StringUtil::filterCleanHtml( $_GET['feedtype'] ) : 'all';
		$var['feedkey'] = isset( $_GET['feedkey'] ) ? StringUtil::filterCleanHtml( urldecode( $_GET['feedkey'] ) ) : '';
		$var['loadNew'] = isset( $_GET['page'] ) ? 0 : 1;
		$var['loadMore'] = isset( $_GET['page'] ) ? 0 : 1;
		$var['loadId'] = isset( $_GET['loadid'] ) ? $_GET['loadid'] : 0;
		$var['nums'] = isset( $_GET['page'] ) ? WbConst::DEF_LIST_FEED_NUMS : 10;
		$var['uid'] = isset( $_GET['uid'] ) ? $_GET['uid'] : "";
		$data = $this->getData( $var );
		$var['loadId'] = isset( $data['lastId'] ) ? $data['lastId'] : 0;
		$this->ajaxReturn( array_merge( $var, $data ), Mobile::dataType() );
	}

	/**
	 * 发布微博操作，用于AJAX
	 * @return json 发布微博后的结果信息JSON数据
	 */
	public function actionAdd() {

		// 返回数据格式
		$return = array( 'isSuccess' => true, 'data' => '' );
		// 用户发送内容
		$d['content'] = isset( $_GET['content'] ) ? StringUtil::filterDangerTag( $_GET['content'] ) : '';
		// 原始数据内容
		$d['body'] = Env::getRequest( 'body' );
		$d['rowid'] = isset( $_GET['rowid'] ) ? intval( $_GET['rowid'] ) : 0;
		$d['from'] = Env::getRequest( 'from' );
		// 安全过滤
		foreach ( $_GET as $key => $val ) {
			$_GET[$key] = StringUtil::filterCleanHtml( $_GET[$key] );
		}
		// 可见 ,手机端不设可见范围
		if ( isset( $_GET['view'] ) ) {
//			$_GET['view'] = $d['view'] = intval( $_GET['view'] );
//			if ( $_GET['view'] == WbConst::CUSTOM_VIEW_SCOPE ) {
//				$scope = StringUtil::getId( $_GET['viewid'], true );
//				if ( isset( $scope['u'] ) ) {
//					$d['userid'] = implode( ',', $scope['u'] );
//				}
//				if ( isset( $scope['d'] ) ) {
//					$d['deptid'] = implode( ',', $scope['d'] );
//				}
//				if ( isset( $scope['p'] ) ) {
//					$d['positionid'] = implode( ',', $scope['p'] );
//				}
//			}
		}
		// 应用分享到微博，原资源链接
		$d['source_url'] = isset( $_GET['source_url'] ) ? urldecode( $_GET['source_url'] ) : '';
		// 滤掉话题两端的空白
		$d['body'] = preg_replace( "/#[\s]*([^#^\s][^#]*[^#^\s])[\s]*#/is", '#' . trim( "\${1}" ) . '#', $d['body'] );
		// 附件ID
		if ( isset( $_GET['attachid'] ) ) {
			$d['attach_id'] = trim( StringUtil::filterCleanHtml( $_GET['attachid'] ) );
			if ( !empty( $d['attach_id'] ) ) {
				$d['attach_id'] = explode( ',', $d['attach_id'] );
				array_map( 'intval', $d['attach_id'] );
			}
		}
		// 发送动态的类型
		$type = StringUtil::filterCleanHtml( Env::getRequest( 'type' ) );
		$table = isset( $_GET['table'] ) ? StringUtil::filterCleanHtml( $_GET['table'] ) : 'feed';
		// 所属模块名称
		$module = isset( $_GET['module'] ) ? StringUtil::filterCleanHtml( $_GET['module'] ) : 'weibo';   // 当前动态产生所属的应用
		$data = Feed::model()->put( IBOS::app()->user->uid, $module, $type, $d, $d['rowid'], $table );
		if ( !$data ) {
			$return['isSuccess'] = false;
			$return['data'] = Feed::model()->getError( 'putFeed' );
			$this->ajaxReturn( $return );
		}
		UserUtil::updateCreditByAction( 'addweibo', IBOS::app()->user->uid );
		// 微博来源设置
		$data['from'] = Env::getFromClient( $data['from'], $data['module'] );
		//$lang = IBOS::getLangSources();
		$return['data'] = $data; // $this->renderPartial( 'feedlist', array( 'list' => array( $data ), 'lang' => $lang ), true );
		// 动态ID
		$return['feedid'] = $data['feedid'];
		// 添加话题
		//FeedTopic::model()->addTopic( html_entity_decode( $d['body'], ENT_QUOTES, 'UTF-8' ), $data['feedid'], $type );
		$this->ajaxReturn( $return, Mobile::dataType() );
	}

	public function actionShare() {
		// 判断资源是否删除
		if ( empty( $_GET['curid'] ) ) {
			$map['feedid'] = Env::getRequest( 'sid' );
		} else {
			$map['feedid'] = Env::getRequest( 'curid' );
		}
		$map['isdel'] = 0;
		$isExist = Feed::model()->countByAttributes( $map );
		if ( $isExist == 0 ) {
			$return['isSuccess'] = false;
			$return['data'] = '内容已被删除，转发失败';
			$this->ajaxReturn( $return );
		}

		// 进行分享操作
		$return = Feed::model()->shareFeed( $_GET, 'share' );
		if ( $return['isSuccess'] ) {
			$module = $_GET['module'];
			// 添加积分
			if ( $module == 'weibo' ) {
				UserUtil::updateCreditByAction( 'forwardweibo', IBOS::app()->user->uid );
				//微博被转发
				$suid = IBOS::app()->db->createCommand()
						->select( 'uid' )
						->from( '{{feed}}' )
						->where( sprintf( "feedid = %d AND isdel = 0", $map['feedid'] ) )
						->queryScalar();
				$suid && UserUtil::updateCreditByAction( 'forwardedweibo', $suid );
			}
		}
		$this->ajaxReturn( $return, Mobile::dataType() );
	}

	/**
	 * 微博详细页
	 */
	public function actionFeed() {
		$feedid = intval( Env::getRequest( 'feedid' ) );
		$feedInfo = Feed::model()->get( $feedid );
		if ( !$feedInfo ) {
			$this->error( IBOS::lang( 'Weibo not exists' ) );
		}
		if ( $feedInfo ['isdel'] == '1' ) {
			$this->error( IBOS::lang( 'No relate weibo' ) );
			exit();
		}
		if ( $feedInfo['from'] == '1' ) {
			$feedInfo['from'] = Env::getFromClient( 6, $feedInfo ['module'], '3G版' );
		} else {
			switch ( $feedInfo ['module'] ) {
				case 'mobile' :
					break;
				default :
					$feedInfo['from'] = Env::getFromClient( $feedInfo ['from'], $feedInfo ['module'] );
					break;
			}
		}
		// 微博图片
		if ( isset( $v["attach_id"] ) ) {
			if ( is_array( $v["attach_id"] ) ) {
				$attachid = $v["attach_id"];
			} else {
				$attachid = explode( ",", $v["attach_id"] );
			}
			$_tmp = Attach::getAttachData( $$attachid );
			$v["attach_url"] = File::getAttachUrl() . '/' . $_tmp[$$attachid[0]]["attachment"]; //?TODO:: 可能多个附件
		}
		// 赞功能
		$diggArr = FeedDigg::model()->checkIsDigg( $feedid, IBOS::app()->user->uid );
		$data = array(
			'diggArr' => $diggArr,
			'fd' => $feedInfo,
			'assetUrl' => IBOS::app()->assetManager->getAssetsUrl( 'user' ),
			'moduleAssetUrl' => IBOS::app()->assetManager->getAssetsUrl( 'weibo' ),
		);
		$this->ajaxReturn( $data, 'JSONP' );
	}

	/**
	 * 获取评论列表
	 */
	public function actionGetCommentList() {
		$module = StringUtil::filterCleanHtml( $_REQUEST['module'] );
		$table = StringUtil::filterCleanHtml( $_REQUEST['table'] );
		$rowid = intval( $_REQUEST['feedid'] );
		$moduleuid = intval( $_REQUEST['moduleuid'] );
		$properties = array(
			'module' => $module,
			'table' => $table,
			'attributes' => array(
				'rowid' => $rowid,
				'limit' => 10,
				'moduleuid' => $moduleuid
			)
		);
		$widget = IBOS::app()->getWidgetFactory()->createWidget( $this, 'application\modules\weibo\core\WeiboComment', $properties );
		$list = $widget->getCommentList();
		foreach ( $list as &$v ) {
			unset( $v["user_info"] );
			unset( $v["sourceInfo"] );
		}
		$this->ajaxReturn( $list, Mobile::dataType() );
	}

	/**
	 * 赞
	 */

	/**
	 * 设置赞与被赞
	 */
	public function actionDigg() {
		$uid = IBOS::app()->user->uid;
		$feedId = intval( Env::getRequest( 'feedId' ) );
		// 是否已赞
		$alreadyDigg = FeedDigg::model()->getIsExists( $feedId, $uid );
		if ( $alreadyDigg ) {
			// 已赞就取消赞
			$result = FeedDigg::model()->delDigg( $feedId, $uid );
			if ( $result ) {
				$feed = Feed::model()->get( $feedId );
				$res['isSuccess'] = true;
				$res['count'] = intval( $feed['diggcount'] );
				$res['digg'] = 0;
			} else {
				$res['isSuccess'] = false;
				$res['msg'] = FeedDigg::model()->getError( 'delDigg' );
			}
		} else {
			// 否则就加一个赞
			$result = FeedDigg::model()->addDigg( $feedId, $uid );
			if ( $result ) {
				$feed = Feed::model()->get( $feedId );
				$res['isSuccess'] = true;
				$res['count'] = intval( $feed['diggcount'] );
				$res['digg'] = 1;
			} else {
				$res['isSuccess'] = false;
				$res['msg'] = FeedDigg::model()->getError( 'addDigg' );
			}
		}
		$this->ajaxReturn( $res, Mobile::dataType() );
	}

	/**
	 * 赞过的人列表 (100个)
	 */
	public function actionDiggList() {
		$feedId = intval( Env::getRequest( 'feedid' ) );
		$count = FeedDigg::model()->countByAttributes( array( 'feedid' => $feedId ) );
		$res = array();
		if ( $count ) {
			$result = FeedDigg::model()->fetchUserList( $feedId, 100 );
			$res['count'] = $count;
			$res['data'] = $result;
			$res['isSuccess'] = true;
			$this->ajaxReturn( $res, Mobile::dataType() );
		} else {
			$this->ajaxReturn( array( 'count' => 0, 'isSuccess' => true ), Mobile::dataType() );
		}
	}

	/**
	 * 粉丝列表
	 */
	public function actionFollower() {
		$uid = $_REQUEST["uid"];
		$count = Follow::model()->getFollowCount( array( $uid ) );
		$list = $this->getFollowData( 'follower', $uid, 0, WbConst::DEF_LIST_FEED_NUMS );

		$data = array(
			'count' => $count[$uid],
			'list' => $list
		);
		$this->ajaxReturn( $data, Mobile::dataType() );
	}

	/**
	 * 关注列表
	 */
	public function actionFollowing() {
		$uid = $_REQUEST["uid"];
		$count = Follow::model()->getFollowCount( array( $uid ) );
		$list = $this->getFollowData( 'following', $uid, 0, 100 );
		$data = array(
			'count' => $count[$uid],
			'list' => $list
		);
		$this->ajaxReturn( $data, Mobile::dataType() );
	}

	/**
	 * 获取关注数据
	 * @param string $type 是关注还是被关注 (following or follower)
	 * @param integer $offset 分页偏移量
	 * @param integer $limit 每页条数
	 * @return array 一个符合列表输出的数组数据
	 */
	protected function getFollowData( $type, $uid, $offset, $limit ) {
		if ( $type == 'follower' ) {
			$data = Follow::model()->getFollowerList( $uid, $offset, $limit );
		} else {
			$data = Follow::model()->getFollowingList( $uid, $offset, $limit );
		}
		if ( !empty( $data ) ) {
			$fids = Convert::getSubByKey( $data, 'fid' );
			$list = Follow::model()->getFollowStateByFids( IBOS::app()->user->uid, $fids );
		} else {
			$list = array();
		}
		return $list;
	}

	/**
	 * 获取微博数据
	 * @param array $var
	 * @return array
	 */
	protected function getData( $var ) {
		$data = array();
		$type = isset( $var['new'] ) ? 'new' . $var['type'] : $var['type']; // 最新的微博与默认微博类型一一对应
		switch ( $type ) {
			case 'following':
				// 设定可查看的关注微博总数，可以提高大数据量下的查询效率
				$pages = Page::create( 1000, WbConst::DEF_LIST_FEED_NUMS );
				if ( !empty( $var['feedkey'] ) ) {
					$list = Feed::model()->searchFeed( $var['feedkey'], 'following', $var['loadId'], $var['nums'], $pages->getOffset() );
				} else {
					$where = 'a.isdel = 0 AND ' . WbfeedUtil::getViewCondition( $this->uid, 'a.' );
					if ( isset( $var['loadId'] ) && $var['loadId'] > 0 ) { //非第一次
						$where .=" AND a.feedid < '" . intval( $var['loadId'] ) . "'";
					}
					if ( !empty( $var['feedtype'] ) && $var['feedtype'] !== 'all' ) {
						$where .=" AND a.type = '" . $var['feedtype'] . "'";
					}
					$list = Feed::model()->getFollowingFeed( $where, $var['nums'], $pages->getOffset() );
				}
				break;
			case 'all':
				$where = 'isdel = 0  AND ' . WbfeedUtil::getViewCondition( $this->uid );
				$where .= empty( $var['uid'] ) ? "" : 'AND uid = ' . $var['uid'];
				$pages = Page::create( WbConst::MAX_VIEW_FEED_NUMS, WbConst::DEF_LIST_FEED_NUMS );
				if ( !empty( $var['feedkey'] ) ) {
					$loadId = isset( $var['loadId'] ) ? $var['loadId'] : 0;
					$list = Feed::model()->searchFeed( $var['feedkey'], 'all', $loadId, $var['nums'], $pages->getOffset(), '', $var['uid'] );
				} else {
					if ( isset( $var['loadId'] ) && $var['loadId'] > 0 ) { //非第一次
						$where .=" AND feedid < '" . intval( $var['loadId'] ) . "'";
					}
					// 动态类型
					if ( !empty( $var['feedtype'] ) && $var['feedtype'] !== 'all' ) {
						$where .=" AND type = '" . StringUtil::filterCleanHtml( $var['feedtype'] ) . "'";
					}
					$list = Feed::model()->getList( $where, $var['nums'], $pages->getOffset() );
				}
				break;
			case 'movement':
				$pages = Page::create( WbConst::MAX_VIEW_FEED_NUMS, WbConst::DEF_LIST_FEED_NUMS );
				if ( !empty( $var['feedkey'] ) ) {
					$list = Feed::model()->searchFeed( $var['feedkey'], 'movement', $var['loadId'], $var['nums'], $pages->getOffset() );
				} else {
					$where = 'isdel = 0 AND ' . WbfeedUtil::getViewCondition( $this->uid );
					if ( isset( $var['loadId'] ) && $var['loadId'] > 0 ) { //非第一次
						$where .=" AND feedid < '" . intval( $var['loadId'] ) . "'";
					}
					// 动态类型
					if ( !empty( $var['feedtype'] ) && $var['feedtype'] !== 'all' ) {
						$where .=" AND module = '" . StringUtil::filterCleanHtml( $var['feedtype'] ) . "'";
					} else {
						$where .=" AND module != 'weibo'";
					}
					$list = Feed::model()->getList( $where, $var['nums'], $pages->getOffset() );
				}
				break;
			case 'newmovement':
				if ( $var['maxId'] > 0 ) {
					$where = sprintf( 'isdel = 0 AND %s AND feedid > %d', WbfeedUtil::getViewCondition( $this->uid ), intval( $var['maxId'] ), $this->uid );
					$list = Feed::model()->getList( $where );
					$data['count'] = count( $list );
				}
				break;
			case 'newfollowing':// 关注的人的最新微博
				$where = 'a.isdel = 0 AND ' . WbfeedUtil::getViewCondition( $this->uid, 'a.' );
				if ( $var['maxId'] > 0 ) {
					$where .=" AND a.feedid > '" . intval( $var['maxId'] ) . "'";
					$list = Feed::model()->getFollowingFeed( $where );
					$data['count'] = count( $list );
				}
				break;
			case 'newall': // 所有人最新微博 -- 正在发生的
				if ( $var['maxId'] > 0 ) {
					$where = sprintf( 'isdel = 0 AND %s AND feedid > %d AND uid <> %d', WbfeedUtil::getViewCondition( $this->uid ), intval( $var['maxId'] ), $this->uid );
					$list = Feed::model()->getList( $where );
					$data['count'] = count( $list );
				}
				break;

			default:
				break;
		}
		if ( !isset( $var['new'] ) ) {
			$pages->route = 'home/index';
			//$data['pageData'] = $this->widget( 'IWPage', array( 'pages' => $pages ), true );
		}
		if ( !empty( $list ) ) {
			$data['firstId'] = $list[0]['feedid'];
			$data['lastId'] = $list[(count( $list ) - 1)]['feedid'];
			//赞功能
			$feedids = Convert::getSubByKey( $list, 'feedid' );
			$diggArr = FeedDigg::model()->checkIsDigg( $feedids, $this->uid );
			foreach ( $list as &$v ) {
				// 这一步是赋值 来自XXX，手机端可根据具体哪种设备来赋值
				// 未来如果动态是来自于不同的模块，该信息也在这里处理
				// 默认是来自网页，即在微博主页发的
				switch ( $v['module'] ) {
					case 'mobile':

						break;
					default:
						$v['from'] = Env::getFromClient( $v['from'], $v['module'] );
						break;
				}
				if ( isset( $v["attach_id"] ) ) {

					if ( is_array( $v["attach_id"] ) ) {
						$attachid = $v["attach_id"];
					} else {
						$attachid = explode( ",", $v["attach_id"] );
					}
					$_tmp = Attach::getAttachData( $attachid );
					$v["attach_url"] = File::getAttachUrl() . '/' . $_tmp[$attachid[0]]["attachment"]; //?TODO:: 可能多个附件
				}
				if ( isset( $v["api_source"]["attach"][0]["attach_url"] ) ) {
					$v["api_source"]["attach_url"] = $v["api_source"]["attach"][0]["attach_url"];
					unset( $v["api_source"]["attach"] );
					unset( $v["api_source"]["source_body"] );
				}

				unset( $v["user_info"] );
				unset( $v["body"] );
				unset( $v["sourceInfo"] );
				unset( $v["api_source"]["source_user_info"] );
				unset( $v["api_source"]["avatar_big"] );
				unset( $v["api_source"]["avatar_middle"] );
				unset( $v["api_source"]["avatar_small"] );
				unset( $v["api_source"]["source_url"] );
				unset( $v["feeddata"] );
			}
			//$data['html'] = $this->renderPartial( 'application.modules.message.views.feed.feedlist', , true );
			$data['list'] = $list;
			$data['diggArr'] = $diggArr;
		} else {
			$data['list'] = array();
			$data['firstId'] = $data['lastId'] = 0;
		}
		return $data;
	}

	/**
	 * 增加一条评论
	 * @return type
	 */
	public function actionAddComment() {
		// 返回结果集默认值
		$return = array( 'isSuccess' => false );
		// 获取接收数据
		$data = $_GET;
		// 安全过滤
		foreach ( $data as $key => $val ) {
			$data[$key] = StringUtil::filterCleanHtml( $data[$key] );
		}
		$data['uid'] = IBOS::app()->user->uid;
		// 评论所属与评论内容
		$data['content'] = StringUtil::filterDangerTag( $data['content'] );
		// 判断资源是否被删除
		if ( $data['table'] == 'feed' ) {
			$table = 'application\modules\message\model\Feed';
		} else {
			$table = 'application\modules\\' . $data['module'] . '\\model\\' . ucfirst( $data['table'] );
		}
		$pk = $table::model()->getTableSchema()->primaryKey;
		$sourceInfo = $table::model()->fetch( array( 'condition' => "`{$pk}` = {$data['rowid']}" ) );
		if ( !$sourceInfo ) {
			$return['isSuccess'] = false;
			$this->ajaxReturn( $return, Mobile::dataType() );
		}
		$data['ctime'] = TIMESTAMP;
		$data['cid'] = Comment::model()->addComment( $data );
		if ( $data['cid'] ) {
			$return['isSuccess'] = true;
		}
		$this->ajaxReturn( $return, Mobile::dataType() );
	}

}
